global borrarPrimero
global agregarUltimo

global cantElementos
global cantNodos


extern free
extern malloc

%define NULL 0
%define offset_primer_nodo 0
%define offset_prox 8				; NO ESTA EMPAQUETADO!
%define offset_dato 0				; NO ESTA EMPAQUETADO!
%define TAM_NODO 16				; NO ESTA EMPAQUETADO!


;int cantElementos(struct lista *unaLista){

;	return cantNodos(unLista->primero);
;}

;int cantNodos(struct *nodo unNodo){

;	if(unNodo ==  NULL)

;		return 0;
;	else

;		return 1 + cantNodos(unNodo->prox)


;}

section .data

section .text

; int cantElementos(struct lista* unaLista ){


cantElementos:

	mov rdi, [rdi+offset_primer_nodo]
	call cantNodos
	ret


;}

; int cantNodos(struct nodo* unNodo){

cantNodos:

	 push rbx
         push r12
	 push r13

	 xor rbx, rbx
	 cmp rdi, NULL
	 je .fin

	 add rbx, 1
	 mov rdi, [rdi+offset_prox]
	 call cantNodos
	 add rbx, rax
.fin:
       	 mov rax, rbx
	 pop r13
	 pop r12
	 pop rbx
	 ret

;}

;void borrarPrimero(struct lista *unaLista){

borrarPrimero:

	;supongo que la lista tiene algun elemento al menos
	;extern void borrarPrimero(struct lista *unaLista);
	; unaLista -> rdi

	; armamos stack frame

	push rbp
	mov rbp, rsp
	push rbx
	push r12
	push r13
	push r14

	mov r12, [rdi]   	;guardo la direccion del nodo a borrar
	mov r13, rdi	 	;guardo la direccion de la lista
	mov rdi, r12     	;pasa a free la direccion del nodo a borrar
	mov rbx, [r12+8] 	;guardo la direccion del nuevo primer nodo
	call free
	mov rdi, r13
	mov [rdi], rbx	       ;apunto al primer nodo

	; desarmo

	pop r14
	pop r13
	pop r12
	pop rbx
	pop rbp
	ret
;}

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;void agregarUltimo(struct lista* unaLista, int unInt){

agregarUltimo:

	;extern void agregarUltimo(struct lista *unaLista, int unInt);
	;unaLista -> rdi    unInt -> rsi

	; armamos stack frame
	push rbp
	mov rbp, rsp
	push rbx
	push r12

	;no modifico r13 r14 r15, la pila ya esta alineada

	mov rbx, [rdi+offset_primer_nodo]; cargo el primer nodo
	cmp rbx, NULL
	je .encontreUltimo

	mov r12, rsi

.cicloAvanzar:

	cmp qword [rbx+offset_prox], NULL 		; comparo si donde estoy, el prox es NULL
	je .encontreUltimo				; salto a borrar si encontre el ultimo
	mov rbx, [rbx+offset_prox]			; cargo en r12 lo que explique antes

	jmp .cicloAvanzar

	.encontreUltimo:

	; tengo en rbx el nodo de la lista
	; tengo que llamar a malloc

	mov rdi, TAM_NODO 				; cargo el primer parametro
	call malloc
	mov [rax], r12
	mov qword [rax+8], NULL

	mov [rbx+8], rax
fin:
	; desarmo
	;no modifico r13 r14 r15, la pila ya esta alineada

	pop r12
	pop rbx
	pop rbp
	ret

;}

	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
